from . import *
# from django.core.serializers.json import DjangoJSONEncoder

"""
===========================================================
公用函数:by：Charles
1:根据ORM条件查询;
2:GET: limit数据库数据分页, 前端接受{}参数，多条件查询;
3:datetime类型不支持json序列化，我们可以自定义datetime的序列化;
===========================================================
"""


def orm_data_search(request, model, order=('-id',), values=(), **kwargs) \
        -> list:
    """
    1:根据ORM条件查询
    :param request: GET=query dict{'a': [b, c]}
    :param model: 模型名
    :param order: 默认按照id排序
    :param values: 需要显示的字段
    :param kwargs: 条件字典
    :return: list
    """
    # kwargs为空是={}
    filters = kwargs
    query = dict(request.GET)
    try:
        # 去除条件外的属性
        query.pop('pagenum')
    except:
        pass
    try:
        query.pop('pagesize')
    except:
        pass
    try:
        query.pop('create_time[]')
    except:
        pass
    for key, value in query.items():
        value = str(value[0])
        # query不为{}拼接条件
        if value != '':
            # ORM大小写不敏感查询条件拼接
            filters[key + '__icontains'] = value
    data = model.objects.filter(**filters).order_by(*order).values(*values)
    return list(data)


def limit_data_paginator(request, model, values=(), order=('-id',),
                         pagesize=2, **kwargs) -> dict:
    """
    2:GET: limit数据库数据分页, 前端接受{}参数，多条件查询
    page = int(request.GET.get('pagenum'))
    :param request:
    :param model: 模型名称，用户list数据返回
    :param values：orm查询;
    :param order：orm查询排序条件; 可以多个排序条件
    :param pagesize：每页需要展示的数据个数;
    :param kwargs: orm条件查询字典
    :return:Return dict
    """
    # 创建变量查询条件，默认为空
    filters = kwargs
    # 获取查询条件字典组
    query = dict(request.GET)
    page = request.GET.get('pagenum')
    # 去除条件外的属性
    try:
        query.pop('pagenum')
    except:
        pass
    try:
        query.pop('pagesize')
    except:
        pass
    try:
        query.pop('create_time[]')
    except:
        pass
    for key, value in query.items():
        value = str(value[0])
        # query不为{}拼接条件
        if value != '':
            # ORM大小写不敏感查询条件拼接
            filters[key + '__icontains'] = value
    # 总数据个数
    data_sum = model.objects.filter(**kwargs).values(
        *values).order_by(*order).count()
    # 判断页数
    pagesize = int(pagesize)
    if data_sum % pagesize == 0:
        page_sum = data_sum // pagesize
    else:
        page_sum = data_sum // pagesize + 1
    # page校验
    if page:
        if int(page) <= page_sum:
            page = int(page)
        else:
            page = 1
    else:
        page = 1
    # limit查询当前页数据
    start = (page - 1) * pagesize
    end = start + pagesize
    # limit查询当前页数据
    current_page_data = model.objects.filter(**kwargs).values(
        *values).order_by(*order)[start:end]
    paginator_data = {
        'current_page_data': list(current_page_data),  # 当前页数据
        'current_page': page,  # 当前页码
        'data_sum': data_sum,  # 总数据个数
        'page_sum': page_sum,  # 总数据页数
    }
    return paginator_data


class JsonToDatetime(json.JSONEncoder):
    """
    3:str,int,list,tuple,dict,bool,None这些数据类型都支撑json序列化操作。
    但是datetime类型不支持json序列化，我们可以自定义datetime的序列化。
    JSONEncoder不知道怎么去把这个数据转换成json字符串的时候，
    它就会调用default()函数，default()函数默认会抛出异常。
    所以，重写default()函数来处理datetime类型的数据。
    json.dumps(list(data), cls=DjangoJSONEncoder)django自带了
    """

    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.strftime('%Y-%m-%d %H: %M: %S')
        elif isinstance(obj, date):
            return obj.strftime('%Y-%m-%d')
        else:
            return json.JSONEncoder.default(self, obj)
